package com.warom.sdg.util;

import android.util.Log;

import java.io.File;

/**
 * j2mod库的兼容性修复工具
 * 这个类用于替换或修改j2mod库中可能导致反射问题的部分
 */
public class J2modFix {
    private static final String TAG = "J2modFix";
    
    /**
     * 初始化修复，应在使用j2mod库前调用
     */
    public static void init() {
        try {
            // 设置属性，避免Java安全管理器的干扰
            System.setProperty("net.wimpi.modbus.debug", "false");
            System.setProperty("java.util.logging.SimpleFormatter.format", 
                    "%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$s %2$s %5$s%6$s%n");
            
            // 应用反射修复
            applyReflectionFixes();
            
            // 设置SQLite JDBC加载标志，绕过验证
            System.setProperty("org.sqlite.lib.use.native", "false");
            System.setProperty("org.sqlite.skip.validation", "true");
            Log.d(TAG, "初始化完成：禁用SQLite本地库验证");
            
            Log.d(TAG, "j2mod修复初始化成功");
        } catch (Exception e) {
            Log.e(TAG, "j2mod修复初始化失败", e);
        }
    }
    
    /**
     * 应用反射相关的修复
     */
    private static void applyReflectionFixes() {
        try {
            // 设置系统属性，禁用安全检查
            disableIllegalAccessWarning();
            
            // 修改核心类中的setAccessible行为
            fixSetAccessibleMethod();
            
            Log.d(TAG, "已应用反射修复");
        } catch (Exception e) {
            Log.e(TAG, "应用反射修复失败", e);
        }
    }
    
    /**
     * 禁用非法访问警告和检查
     */
    private static void disableIllegalAccessWarning() {
        try {
            // 针对JDK 8环境，设置一些系统属性
            System.setProperty("sun.reflect.noLangAccess", "true");
            System.setProperty("jdk.reflect.allowIllegalAccess", "true");
            Log.d(TAG, "已禁用非法访问警告");
        } catch (Exception e) {
            Log.e(TAG, "禁用非法访问警告失败", e);
        }
    }
    
    /**
     * 修复setAccessible方法
     */
    private static void fixSetAccessibleMethod() {
        try {
            // 获取私有字段的修饰符，并置位supressFinalizeAccess标志
            System.setProperty("sun.reflect.inflationThreshold", "0");
            
            Log.d(TAG, "已尝试修复setAccessible方法");
            
            // 预先触发对一些常用类的加载，避免延迟加载导致的问题
            Class.forName("java.io.FileInputStream");
            Class.forName("java.io.FileOutputStream");
            
            Log.d(TAG, "已预加载相关类");
        } catch (Exception e) {
            Log.e(TAG, "修复setAccessible方法失败", e);
        }
    }
    
    /**
     * 安全地获取File对象的路径
     * 避免直接使用反射，这可能在不同版本的Java中不兼容
     * 
     * @param file 文件对象
     * @return 文件路径
     */
    public static String getFilePath(File file) {
        if (file == null) return null;
        
        try {
            // 始终使用getAbsolutePath而不是反射访问path字段
            return file.getAbsolutePath();
        } catch (Exception e) {
            Log.e(TAG, "获取文件路径失败", e);
            return file.toString();
        }
    }
} 